/**
 * Trabajo de Ingeniería de Software 2
 * Año 2008
 * Sistema de Reserva de Recursos.
 * Desarrolladores: - Marcelo Ferreira.
 *                  - Christian Gómez.
 *                  - Marcelo Rodas.
 */
package modelo;

import java.io.Serializable;
import java.util.Collection;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.Table;

/**
 * Clase Entidad Recurso (JPA)
 * @author jmferreira
 */
@Entity
@Table(name = "recurso")
@NamedQueries({@NamedQuery(name = "Recurso.findByIdRecurso", query = "SELECT r FROM Recurso r WHERE r.idRecurso = :idRecurso"), @NamedQuery(name = "Recurso.findByDescripcionRecurso", query = "SELECT r FROM Recurso r WHERE r.descripcionRecurso = :descripcionRecurso"), @NamedQuery(name = "Recurso.findByMarca", query = "SELECT r FROM Recurso r WHERE r.marca = :marca"), @NamedQuery(name = "Recurso.findByModelo", query = "SELECT r FROM Recurso r WHERE r.modelo = :modelo"), @NamedQuery(name = "Recurso.findByDisponible", query = "SELECT r FROM Recurso r WHERE r.disponible = :disponible"), @NamedQuery(name = "Recurso.findByNrodocumento", query = "SELECT r FROM Recurso r WHERE r.nrodocumento = :nrodocumento")})
public class Recurso implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @Column(name = "idRecurso", nullable = false)
    private Integer idRecurso;
    @Column(name = "descripcionRecurso", nullable = false)
    private String descripcionRecurso;
    @Column(name = "marca")
    private String marca;
    @Column(name = "modelo")
    private String modelo;
    @Column(name = "disponible", nullable = false)
    private boolean disponible;
    @Column(name = "nrodocumento")
    private String nrodocumento;
    @JoinColumn(name = "idTipoRecurso", referencedColumnName = "idTipoRecurso")
    @ManyToOne
    private Tiporecurso idTipoRecurso;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "idRecurso")
    private Collection<Reserva> reservaCollection;

    /**
     * Crea una nueva instancia de Recurso 
     */
    public Recurso() {
    }

    /**
     * Crea una nueva instancia de Recurso con valores especificos
     * @param idRecurso El idRecurso de Recurso
     */
    public Recurso(Integer idRecurso) {
        this.idRecurso = idRecurso;
    }

    /**
     * Crea una nueva instancia de Recurso con valores especificos
     * @param idRecurso El idRecurso de Recurso
     * @param descripcionRecurso El de Recurso
     * @param disponible El valor disponible de Recurso <code>true</code> si esta disponible y <code>false</code> si no lo está.
     */
    public Recurso(Integer idRecurso, String descripcionRecurso, boolean disponible) {
        this.idRecurso = idRecurso;
        this.descripcionRecurso = descripcionRecurso;
        this.disponible = disponible;
    }

    /**
     * Obtiene el idRecurso de Recurso
     * @return El idRecurso de Recurso
     */
    public Integer getIdRecurso() {
        return idRecurso;
    }

    /**
     * Fija el idRecurso de Recurso al valor especificado
     * @param idRecurso El idRecurso de Recurso
     */
    public void setIdRecurso(Integer idRecurso) {
        this.idRecurso = idRecurso;
    }

    /**
     * Obtiene la descripcionRecurso de Recurso
     * @return la descripcionRecurso de Recurso
     */
    public String getDescripcionRecurso() {
        return descripcionRecurso;
    }

    /**
     * Fija la descripcionRecurso de Recurso al valor especificado
     * @param descripcionRecurso La descripcionRecurso de Recurso
     */
    public void setDescripcionRecurso(String descripcionRecurso) {
        this.descripcionRecurso = descripcionRecurso;
    }

    /**
     * Obtiene la marca de Recurso
     * @return La marca de Recurso
     */
    public String getMarca() {
        return marca;
    }

    /**
     * Fija la marca de Recurso
     * @param marca La marca de Recurso
     */
    public void setMarca(String marca) {
        this.marca = marca;
    }

    /**
     * Obtiene el modelo de Recurso
     * @return El modelo de Recurso
     */
    public String getModelo() {
        return modelo;
    }

    /**
     * Fija el modelo de Recurso
     * @param modelo El modelo de Recurso
     */
    public void setModelo(String modelo) {
        this.modelo = modelo;
    }

    /**
     * Obtiene el valor disponible de Recurso
     * @return El valor disponible de Recurso. <code>true</code> si esta disponible y <code>false</code> si no lo está.
     */
    public boolean getDisponible() {
        return disponible;
    }

    /**
     * Fija el valor disponible de Recurso al valor especificado
     * @param disponible El valor disponible de Recurso
     */
    public void setDisponible(boolean disponible) {
        this.disponible = disponible;
    }

    /**
     * Obtiene el nroDocumento de Recurso
     * @return El nroDocumento de Recurso
     */
    public String getNrodocumento() {
        return nrodocumento;
    }

    /**
     * Fija el nroDocumento de Recurso
     * @param nrodocumento El nroDocumento de Recurso
     */
    public void setNrodocumento(String nrodocumento) {
        this.nrodocumento = nrodocumento;
    }

    /**
     * Obtiene el tipoRecurso de Recurso
     * @return El tipoRecurso de Recurso
     */
    public Tiporecurso getIdTipoRecurso() {
        return idTipoRecurso;
    }

    /**
     * FIja el tipoRecurso de Recurso
     * @param idTipoRecurso El tipoRecurso de Recurso
     */
    public void setIdTipoRecurso(Tiporecurso idTipoRecurso) {
        this.idTipoRecurso = idTipoRecurso;
    }

    /**
     * Obtiene una reservaCollection de Recurso
     * @return La reservaCollection de Recurso
     */
    public Collection<Reserva> getReservaCollection() {
        return reservaCollection;
    }

    /**
     * Fija una reservaCollection de Recurso al valor especificado
     * @param reservaCollection La reservaCollection de Recurso
     */
    public void setReservaCollection(Collection<Reserva> reservaCollection) {
        this.reservaCollection = reservaCollection;
    }

    /**
     * Retorna un valor de Hash para el objeto.
     * Esta implementacion evalua un valor hash basado sobre los campos id en este objeto
     * @return Un valor de hash para este objeto
     */
    @Override
    public int hashCode() {
        int hash = 0;
        hash += (idRecurso != null ? idRecurso.hashCode() : 0);
        return hash;
    }

    /**
     * Determina si otro objeto es igual a Recurso. El resultado es
     * <code>true</code> si y solo si el argumento no es nulo y es un objeto Recurso
     * que tiene el mismo valor del campo id en este objeto.
     * @param object La referencia objeto con el cual comparar
     * @return <code>true</code> Si este objeto es la misma que su argumento;
     * <code>false</code> si no lo es.
     */
    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Recurso)) {
            return false;
        }
        Recurso other = (Recurso) object;
        if ((this.idRecurso == null && other.idRecurso != null) || (this.idRecurso != null && !this.idRecurso.equals(other.idRecurso))) {
            return false;
        }
        return true;
    }

    /**
     * Retorna una representacion String de este objeto.  Esta implementacion This implementation construye
     * la representacion basada en los campos id.
     * @return Una representacion String del objeto.
     */
    @Override
    public String toString() {
        return idRecurso + "(" + this.getDescripcionRecurso() + ")";
    }
}
